{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Spiking Neural Network with Eve"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this script, we will build a general spiking neural network with eve-mli, then we will further investigating the \n",
    "influence of different Node, i.e. IFNode and LIFNode combined with different surrotage functions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# import necessary packages.\n",
    "# at the beginning, ensure that the eve-mli package is in your python path.\n",
    "# or you just install it via `pip install eve-mli`.\n",
    "\n",
    "import os\n",
    "import time\n",
    "from datetime import datetime\n",
    "\n",
    "import random\n",
    "import numpy as np\n",
    "import torch as th\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "import eve\n",
    "import eve.app\n",
    "import eve.app.model\n",
    "import eve.app.trainer\n",
    "import eve.core\n",
    "import eve.app.space as space\n",
    "import eve.core.layer\n",
    "\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "os.environ[\"CUDA_VISIBLE_DEVICES\"] = '1'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# build a basic network for trainer, use Poisson Encoder as default\n",
    "class mnist(eve.core.Eve):\n",
    "    def __init__(self,\n",
    "                 timesteps: int = 5,\n",
    "                 node: str=\"IFNode\",\n",
    "                 voltage_threshold: float = 1.0,\n",
    "                 voltage_reset: float = 0.0,\n",
    "                 learnable_threshold: bool = False,\n",
    "                 learnable_reset: bool = False,\n",
    "                 time_dependent: bool = True,\n",
    "                 neuron_wise: bool = True,\n",
    "                 surrogate_fn: str = \"Sigmoid\",\n",
    "                 binary: bool = True,\n",
    "                 **kwargs,):\n",
    "        super().__init__()\n",
    "        \n",
    "        # we support IFNode and LIFNode, \n",
    "        # in non-spiking mode, the IFNode equals to a ReLU operation\n",
    "        # the LIFNode equals to a LeakyReLU operation.\n",
    "        node = getattr(eve.core.node, node)\n",
    "        \n",
    "        def build_node(state):\n",
    "            return node(state, \n",
    "                        voltage_threshold=voltage_threshold,\n",
    "                        voltage_reset=voltage_reset,\n",
    "                        learnable_threshold=learnable_threshold,\n",
    "                        learnable_reset=learnable_reset,\n",
    "                        time_dependent=time_dependent,\n",
    "                        neuron_wise=neuron_wise,\n",
    "                        surrogate_fn=surrogate_fn,\n",
    "                        binary=binary,\n",
    "                        **kwargs,)\n",
    "        \n",
    "        self.encoder = eve.core.layer.PoissonEncoder(timesteps=timesteps)\n",
    "        \n",
    "        self.conv1 = nn.Sequential(\n",
    "            nn.Conv2d(1, 4, 3, stride=2, padding=1),\n",
    "            nn.BatchNorm2d(4),\n",
    "        )\n",
    "        self.node1 = build_node(eve.core.State(self.conv1))\n",
    "\n",
    "        self.conv2 = nn.Sequential(\n",
    "            nn.Conv2d(4, 8, 3, stride=2, padding=1),\n",
    "            nn.BatchNorm2d(8),\n",
    "        )\n",
    "        self.node2 = build_node(eve.core.State(self.conv2))\n",
    "\n",
    "        self.conv3 = nn.Sequential(\n",
    "            nn.Conv2d(8, 16, 3, stride=2, padding=1),\n",
    "            nn.BatchNorm2d(16),\n",
    "        )\n",
    "        self.node3 = build_node(eve.core.State(self.conv3))\n",
    "\n",
    "        self.linear1 = nn.Linear(16 * 4 * 4, 16)\n",
    "        self.node4 = build_node(eve.core.State(self.linear1))\n",
    "\n",
    "        self.linear2 = nn.Linear(16, 10)\n",
    "\n",
    "    def forward(self, x):\n",
    "        encoder = self.encoder(x)\n",
    "        \n",
    "        conv1 = self.conv1(encoder)\n",
    "        node1 = self.node1(conv1)\n",
    "\n",
    "        conv2 = self.conv2(node1)\n",
    "        node2 = self.node2(conv2)\n",
    "\n",
    "        conv3 = self.conv3(node2)\n",
    "        node3 = self.node3(conv3)\n",
    "\n",
    "        node3 = th.flatten(node3, start_dim=1).unsqueeze(dim=1)\n",
    "\n",
    "        linear1 = self.linear1(node3)\n",
    "        node4 = self.node4(linear1)\n",
    "\n",
    "        linear2 = self.linear2(node4)\n",
    "\n",
    "        return linear2.squeeze(dim=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# define a MnistClassifier\n",
    "# Classifier uses the corss entropy as default.\n",
    "# in most case, we just rewrite the `prepare_data`.\n",
    "class MnistClassifier(eve.app.model.Classifier):\n",
    "    def prepare_data(self, data_root: str):\n",
    "        from torch.utils.data import DataLoader, random_split\n",
    "        from torchvision import transforms\n",
    "        from torchvision.datasets import MNIST\n",
    "\n",
    "        train_dataset = MNIST(root=data_root,\n",
    "                              train=True,\n",
    "                              download=True,\n",
    "                              transform=transforms.ToTensor())\n",
    "        test_dataset = MNIST(root=data_root,\n",
    "                             train=False,\n",
    "                             download=True,\n",
    "                             transform=transforms.ToTensor())\n",
    "        self.train_dataset, self.valid_dataset = random_split(\n",
    "            train_dataset, [55000, 5000])\n",
    "        self.test_dataset = test_dataset\n",
    "\n",
    "        self.train_dataloader = DataLoader(self.train_dataset,\n",
    "                                           batch_size=128,\n",
    "                                           shuffle=True,\n",
    "                                           num_workers=4)\n",
    "        self.test_dataloader = DataLoader(self.test_dataset,\n",
    "                                          batch_size=128,\n",
    "                                          shuffle=False,\n",
    "                                          num_workers=4)\n",
    "        self.valid_dataloader = DataLoader(self.valid_dataset,\n",
    "                                           batch_size=128,\n",
    "                                           shuffle=False,\n",
    "                                           num_workers=4)\n",
    "        \n",
    "    def forward(self, batch_idx, batch, *args, **kwargs):\n",
    "        # in spiking mode, you should reset the membrane voltage every time.\n",
    "        self.reset()\n",
    "        \n",
    "        x, y = batch\n",
    "        \n",
    "        y_hat = [self.model(x) for _ in range(self.model.encoder.timesteps)]\n",
    "        y_hat = th.stack(y_hat, dim=0).mean(dim=0)\n",
    "        \n",
    "        return {\n",
    "            \"loss\": F.cross_entropy(y_hat, y),\n",
    "            \"acc\": self._top_one_accuracy(y_hat, y),\n",
    "        }"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# store accuracy result\n",
    "y = {}\n",
    "def plot():\n",
    "    global y\n",
    "    keys, values = list(y.keys()), list(y.values())\n",
    "    for k, v in y.items():\n",
    "        plt.plot(v, \n",
    "                 color='green' if random.random() > 0.5 else \"red\", \n",
    "                 marker='o' if random.random() > 0.5 else \"*\", \n",
    "                 linestyle='-' if random.random() > 0.5 else \":\", \n",
    "                 label=k)\n",
    "    plt.title('accuracy over epoches (train)')\n",
    "    plt.xlabel('epochs')\n",
    "    plt.ylabel('accuracy')\n",
    "    plt.legend(loc=\"upper left\")\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def train(net, exp_name: str = \"snn\", data_root: str = \"/home/densechen/dataset\"):\n",
    "    global y\n",
    "    # replace the data_root for your path.\n",
    "    classifier = MnistClassifier(net)\n",
    "    classifier.prepare_data(data_root=data_root)\n",
    "    \n",
    "    # use default configuration\n",
    "    classifier.setup_train()\n",
    "    \n",
    "    # assign model to trainer\n",
    "    eve.app.trainer.BaseTrainer.assign_model(classifier)\n",
    "    \n",
    "    trainer = eve.app.trainer.BaseTrainer()\n",
    "    \n",
    "    # train 10 epoches and report the final accuracy\n",
    "    y[exp_name] = []\n",
    "    tic = datetime.now()\n",
    "    for _ in range(10):\n",
    "        info = trainer.fit()\n",
    "        y[exp_name].append(info[\"acc\"])\n",
    "    info = trainer.test()\n",
    "    toc = datetime.now()\n",
    "    y[exp_name] = np.array(y[exp_name])\n",
    "    print(f\"Test Accuracy: {info['acc']*100:.2f}%, Elapsed time: {toc-tic}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# IFNode with different timesteps"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "===> timesteps: 1\n",
      "Test Accuracy: 92.84%, Elapsed time: 0:01:00.376058\n",
      "===> timesteps: 2\n",
      "Test Accuracy: 95.23%, Elapsed time: 0:01:27.988771\n",
      "===> timesteps: 5\n",
      "Test Accuracy: 96.73%, Elapsed time: 0:02:39.402739\n",
      "===> timesteps: 10\n",
      "Test Accuracy: 96.38%, Elapsed time: 0:04:20.826122\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# reset y\n",
    "y = {}\n",
    "\n",
    "# define spiking neural network with different timesteps\n",
    "ifnode_spiking_neural_network_1_timesteps = mnist(timesteps=1).spike()\n",
    "ifnode_spiking_neural_network_2_timesteps = mnist(timesteps=2).spike()\n",
    "ifnode_spiking_neural_network_5_timesteps = mnist(timesteps=5).spike()\n",
    "ifnode_spiking_neural_network_10_timesteps = mnist(timesteps=10).spike()\n",
    "\n",
    "# train and compare the influence of different timesteps.\n",
    "print(\"===> timesteps: 1\")\n",
    "train(ifnode_spiking_neural_network_1_timesteps, \"timesetps=1\")\n",
    "\n",
    "print(\"===> timesteps: 2\")\n",
    "train(ifnode_spiking_neural_network_2_timesteps, \"timesteps=2\")\n",
    "\n",
    "print(\"===> timesteps: 5\")\n",
    "train(ifnode_spiking_neural_network_5_timesteps, \"timesteps=5\")\n",
    "\n",
    "print(\"===> timesteps: 10\")\n",
    "train(ifnode_spiking_neural_network_10_timesteps, \"timesteps=10\")\n",
    "\n",
    "plot()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# IFNode vs LIF Node"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "===> IFNode\n",
      "Test Accuracy: 96.10%, Elapsed time: 0:02:40.809373\n",
      "===> LIFNode, tau=1.0\n",
      "Test Accuracy: 96.30%, Elapsed time: 0:02:54.205864\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# reset y\n",
    "y = {}\n",
    "\n",
    "# define IFNode network\n",
    "ifnode_spiking_neural_network = mnist(node=\"IFNode\").spike()\n",
    "\n",
    "# define LIFNode network\n",
    "lifnode_spiking_neural_network = mnist(node=\"LIFNode\", tau=1.0).spike()\n",
    "\n",
    "# train and compare\n",
    "print(\"===> IFNode\")\n",
    "train(ifnode_spiking_neural_network, \"IFNode\")\n",
    "\n",
    "print(\"===> LIFNode, tau=1.0\")\n",
    "train(lifnode_spiking_neural_network, \"LIFNode\")\n",
    "\n",
    "plot()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## IFNode with different configurations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "===> IFNode learnable threshold\n",
      "Test Accuracy: 95.34%, Elapsed time: 0:02:47.300100\n",
      "===> IFNode learnable reset\n",
      "Test Accuracy: 88.60%, Elapsed time: 0:02:44.121851\n",
      "===> IFNode time independent\n",
      "Test Accuracy: 96.38%, Elapsed time: 0:02:36.499136\n",
      "===> IFNode neuron share\n",
      "Test Accuracy: 95.99%, Elapsed time: 0:02:41.603358\n"
     ]
    },
    {
     "data": {
      "image/png": "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2xg2bBjdunWjb9++/P7770cdx/sX+bXXXssdt99Oz57diYmN4eO330KAhrWa8sB/XqNVjx4MGTKE/fv3e7ZfuXIl/fv3p1u3bgwdOpQ9e/YAzkBEd95551HdiGdmZnLdddfRs2dPunTpwtdff+2J45JLLmHYsGG0aNGCBx54wHOM6dOn07JlS3r27Fmkq/FjdUM+efJkrrvuOgYMGEDTpk156aWXSjynxphydHjQllP91a1bNy1u48aNRab7T++v01dNV1XVvII87T+9v76/5n1VVW30fCNlMke9aj1dS1VVkzKTtP/0/jrr91mqqronfc9Rxytux44d2q5duxKnp0+frs2aNdMde3foxp/naGRYmL42caK6li/XG68eo0/8+wlVVR00aJBu3rxZVVWXLl2qAwcOPOo406dP11tvvVVVVa+54gq9bOhQTV/5q34351NtGhur6nLp559/rkOGDNGCggJNTEzUqKgo/eyzzzQvL0979+6t+/fvV1XVjz/+WMeNG+ecr/799YYbblBV1YULF3pif/DBB/X9953zdvDgQW3RooVmZGTo9OnTtUmTJnro0CHNzs7WmJgYjY+P1927d2ujRo10//79mpubq2eddZYn3jFjxuhPP/2kqqpxcXHaunVrVVWdNGmS9u7dW3NycjQpKUlr1qypeXl5R53TP6P434UxVRnOENAlXldPzXKGclDe3X2XZODAgcSeEUveoSwiI8Lpfl5fUsL96NKqLZt2J5GRkcHixYsZNWqUZ5vc3NwS96UFBSTGrSczO5WL+/UjvEFjzuvcnf3J14EIixYtYsyYMfj7+1O/fn0GDRoEwB9//MH69es555xzAGfkunr16nn2W1I34nPmzGHWrFk8++yzgNORYHx8PACDBw/2dBTYtm1b4uLiSE5OZsCAAdSuXRuAyy+/nM2bNwNHd0Oelpbm6dBw+PDhBAcHExwcTJ06ddi3b99fPOPGmJNRpRKEL7v7LklwcDAAebEx+AUF06RtT2rVqkVw/bUU7N6Ly+WievXqrF69+tg7yc2FpCTkwAEK8nPRgACCmjd3usOAIqPOlURVadeuHUuWLClxeUndiKsqn3/+Oa1atSqy7Ndff/V8JgB/f38KCgqOe3yXy8XSpUsJCQk5atnJ7ssYU7asDsKtPLr7joiIID09/YTrJR9MoECPvvhFRkbSpEkT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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# reset y\n",
    "y = {}\n",
    "\n",
    "# define IFNode network with different configuration\n",
    "ifnode_spiking_neural_network_learnable_threshold = mnist(learnable_threshold = True).spike()\n",
    "print(\"===> IFNode learnable threshold\")\n",
    "train(ifnode_spiking_neural_network_learnable_threshold, \"learnable threshold\")\n",
    "\n",
    "ifnode_spiking_neural_network_learnable_reset = mnist(learnable_reset=True).spike()\n",
    "print(\"===> IFNode learnable reset\")\n",
    "train(ifnode_spiking_neural_network_learnable_reset, \"learable reset\")\n",
    "\n",
    "ifnode_spiking_neural_network_time_independent = mnist(time_dependent=False).spike()\n",
    "print(\"===> IFNode time independent\")\n",
    "train(ifnode_spiking_neural_network_time_independent, \"time independent\")\n",
    "\n",
    "ifnode_spiking_neural_network_neuron_share = mnist(neuron_wise=False).spike()\n",
    "print(\"===> IFNode neuron share\")\n",
    "train(ifnode_spiking_neural_network_neuron_share, \"neuron share\")\n",
    "\n",
    "plot()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## IFNode with different surrogate functions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "===> IFNode PiecewiseQuadratic\n",
      "Test Accuracy: 96.59%, Elapsed time: 0:02:50.522003\n",
      "===> IFNode SoftSign\n",
      "Test Accuracy: 96.74%, Elapsed time: 0:02:46.623716\n",
      "===> IFNode ATan\n",
      "Test Accuracy: 94.56%, Elapsed time: 0:02:44.426878\n",
      "===> IFNode NonzeroSignLogAbs\n",
      "Test Accuracy: 95.71%, Elapsed time: 0:02:39.817249\n",
      "===> IFNode Erf\n",
      "Test Accuracy: 26.70%, Elapsed time: 0:02:43.860484\n",
      "===> IFNode PiecewiseLeakyReLU\n",
      "Test Accuracy: 96.82%, Elapsed time: 0:02:47.646427\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEWCAYAAABrDZDcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAABWBUlEQVR4nO3dd3gU1frA8e+7u+kJKYSaAKH3EKoVQQFRAcGCBQSxISp2vbarYsF+bdcGNqRcBbEBP0QFpSmK9N5J6C0kIT1bzu+P2SxZCBCEEGDfz/Psk53+7mx23plzzpwRYwxKKaUCl62iA1BKKVWxNBEopVSA00SglFIBThOBUkoFOE0ESikV4DQRKKVUgNNEoNQZSkQGicjcU7St30Wk9UlcX0cRWVvGeZNF5I+TtW11OE0ESqmjEpFeQLYxZrF3eJiIjD2RdRpj5hhjGpdx3mVApjcOVQ40EahyJ5az5n9NRBwVHcMpNgQYU9aZy+n7HgfceZLXqbzOmh+nOjoReVxENopItoisEpGrDpl+h4isLjG9jXd8LRH5VkT2iki6iLznHe93VigiSSJiig+SIjJTRIaLyO9AHlBPRG4psY1NInLnITH0FpElInLAG+tlItJXRBYeMt9DIvLDET5nTRGZJCL7RWSDiNxRYny+iMSVmLe1iOwTkSDv8K3e+DJE5CcRqVNiXiMi94jIemD9EbZ9roj8ISKZIrJURDqXmDZTRF4Wkfnez/fDIbFcKSIrvcvOFJGmJaaV+h2UmP6GN+bNInJ5ifHRIvKpiOwUke0i8qKI2L3TGojILBHJ8u6D8Uf4TMHAJcAs7/BlwJPA9SKSIyJLS3y+Mn/fItJZRLaVGE4VkUdEZJk3pvEiEloilJlAFxEJKS1OdYKMMfoKgBfQF6iJlfyvB3KBGiWmbQfaAwI0AOoAdmAp8BYQAYQCF3qXGQaMLbH+JMAADu/wTGAL0BxwAEFAD6C+dxudsA4YbbzzdwCygG7eGBOAJkAIsB9oWmJbi4FrjvA5ZwMfeGNNAfYCl3in/QrcUWLe14GPvO97AxuApt54/w38UWJeA/wCxAFhpWw3AUgHrvDG3807XKXE/tgOtPDuy2+K9x/QyPt9dPPup395Ywk+xncwCHACd3jnuwvYAYh3+nfACO9yVYH5wJ3eaV8CT3lj9a2zlM/VHMg9ZJzfd/8Pv+/OwLYSy6d646vp3cergSGHbOMAkFzRv6Wz8VXhAeirgr54WAL09r7/Cbi/lHnO8x5IHaVM8zsYUHoieP4YMXxfvF3vAeutI8z3ITDc+745kAGElDJfLcANRJUY9zIwyvv+duBX73sBtgIXeYd/BG4rsZzNe+Cq4x02eBPKEWJ8DBhzyLifgJtL7I9XSkxrBhR5D+BPAxMO2fZ278HyaN/BIGBDieFwb5zVgWpAISWSFnAj8Jv3/WhgJJB4jO/oAmDX0b77f/h9d+bwRHBTieHX8CbpEuO2F39f+jq5Ly0aChAiMtBb7JIpIplYZ6bx3sm1gI2lLFYLSDPGuP7hZrceEsPlIvKnt9gmE+vs+VgxAHwB9BMRAQZgHTQLS5mvJrDfGJNdYlwa1tk6WGfh54lIDeAiwAPM8U6rA7xTYv/sx0oWCSXW5fd5DlEH6Fu8vHcdFwI1jrB8GtZZc7w37rTiCcYYj3feBI79HewqsVye922kN54gYGeJeEZgXRmAddUhwHxvkdStR1h/BhB1lM9d0vF830f9LFhJOPKQ6VFAZhljUcch0Cq9ApK3rPtjoAswzxjjFpElWAcCsH7A9UtZdCtQW0QcpRyIcrHOQItVL2V5X9e23rLdb4CBwA/GGKeIfF+GGDDG/CkiRUBHoJ/3VZodQJyIRJVIBrWxziQxxmSIyM9YRWNNga+M91TTu/3hxphxR1i33+cpxVasK4I7jjJPrRLva2MV6+zzxt2yeII34dXyxl3Ikb+Do9nqXTa+tOWMMbuwipQQkQuB6SIy2xiz4ZBZN3hDSjDGbC9e/AjbPJ7v+7iISAJWUVmZmpyq46NXBIEhAutHuhdARG7BuiIo9gnwiIi0FUsDb/KYD+wEXhGRCBEJFZELvMssAS4SkdoiEg08cYwYgrHK+/cCLm+l5qUlpn8K3CIiXUTEJiIJItKkxPTRwHuA0xhTatt5Y8xW4A/gZW+sycBtQMmmjv/DOjhd631f7CPgCRFp7t1H0SLS9xifqaSxQC8R6S4idu/2O4tIYol5bhKRZiISDjwPTDTGuIEJQA/vZw8CHsY6iP/B0b+DIzLG7AR+Bv4jIpW8+7S+iHTyfr6+JWLLwPr/8JSyniJgOlYZf7HdQJIcvWXQsb7v49UJq1ivtCtBdYI0EQQAY8wq4D/APKwfcUvg9xLTvwaGYx0Ys7HKcuO8B6leWJXHW4BtWGfTGGN+AcYDy4CFwJRjxJAN3Id10MvAOqufVGL6fOAWrErRLKxWKnVKrGIMVvI6Vvv1G7HqK3ZgVZY+a4yZXmL6JKAhVrn30hLb/w54FfhKRA4AK4DLKSNvEuqN1aJmL9YZ+aP4/8bGAKOwikBCsfYHxpi1wE3Af7GuEHoBvYwxRUf7DspgINYBeRXWPp/IwaKq9sBfIpKDtU/uN8ZsOsJ6RmAVyRX72vs3XUQWlbbAsb7vf6A/VrJW5UAOXhkrdfoSkTBgD1ark1Kbb57ORGQmVgXrJxUdyz/hbRY61HhvKjvF204GRhhjzjvV2w4UWkegzhR3AX+fiUngbGCMOWZxVDluexlW6ylVTjQRqNOeiKRiVTL2qdhIlDo7adGQUkoFOK0sVkqpAFduRUMi8hnQE9hjjGlRynQB3sG6ySQPGGSMKbUFQknx8fEmKSnpJEerlFJnt4ULF+4zxlQpbVp51hGMwmr3PfoI0y/HasbXEDgHqxuBc4610qSkJBYsWHCSQlRKqcAgImlHmlZuRUPGmNlYt+kfSW9gtLH8CcR4b/1XSil1ClVkHUEC/n2TbMO/XxcfERksIgtEZMHevXtPSXBKKRUozojKYmPMSGNMO2NMuypVSi3iUkop9Q9V5H0E2/HvhCvRO+64OZ1Otm3bRkFBwUkJTJ2dQkNDSUxMJCgoqKJDUeq0UpGJYBIwVES+wqokzvJ2lHXctm3bRlRUFElJSViNkZTyZ4whPT2dbdu2Ubdu3YoOR6nTSrkVDYnIl1idnDUWkW0icpuIDBGRId5ZpgKbsLq5/Ri4+59uq6CggMqVK2sSUEckIlSuXFmvGtVxGbd8HElvJ2F7zkbS20mMW360XsrP3DjK7YrAGHPjMaYb4J6TtT1NAupY9H/k2O7+v7sZuXAkbuPGLnYGtx3MBz0+OOVx3PF4c350rmJHFNTMhsuDmvHxKytPaQzjlo/jw7dvwhUDRIFraxofvn0TPAD9W/Y/q+LQvoZUwBu3fBxPzXiKLVlbqB1dm+Fdhp/SHzpA19FdmbF5hm+4S90uTB84/ShLnHx3/9/djJz/IW5vOYHbuBk5/0OAk54MPMaD0+3E6XEe9vfZ4d34OngD+WHWvNsrwbiiVeQ/XI97HhiHx3h8L4PxG/abZo4yrQzLfTliKIuqQ37wwTj2h8FH7wxg5607cXvcON1OHDaHb52F7kKCbcF4jPVohwJ3AaGOUJxuJ4KQ78on1BGKy2M9K6h4frdx+4ZDCMLjceGx2yhwFbD2mxEsqnlIHKHw6X9vpf9ITQSnFbvdTsuWLXG5XDRt2pQvvviCVatWMXr0aN59991TFsdHH31EeHg4AwcOPO5l586dy0MPPcSBAwcwxnD//fdz993/uMTOz7Bhw4iMjOSRRx7xjUvPS2d79naK3EUE24NJiEqgcnhl3/SZM2cSHBzM+eefD5zYZzuSccvHMfDbgXi8z2RJy0pj4LfW+k9FMjDG0G10N2ZumuFXUDtz4wwu+uwi/nft/3B5XLg9blwel/XelHhfYrzL4yLXmYvL48Jhc+D2uNmTuwdBCA8Ox+VxkZaZRrA9mEohlXB5XKxNX0tEUASRwZGM/uND3MH+8bltMGreh+zO3Y0gpGamEhkUiQcPNrGxI3sHYY4wXMaFDRv78vcRShDhuUXkhtrY784hwm2j5r4iNscYDticROa5abUbFtSAvBCokg2d0+DHBpATaj1LM/+QOPKD4ZeizYz77Hya7IFrV8N/zrPGt9gFfVfBSx2hMAha77CGn+kMLgecsxWuXQWPdQWPHTqmwjWr4QHv0ya6bITea+G+K6zhHmvhsg2w7JJS4giCTdGGuHse5bY+1rj7/4AOO6D/tdbwsF+hxV641vvUiHenQt0M6OX9dxr9LVTLge7ef+NJ/4PIIrhkkPe7/xw8cnC4dkzp+2NdVNEx/rvKLiATQXmcAYaFhbFkyRIA+vfvz0cffcRDDz1Eu3btTkLEZTdkyJBjz1SKXbt20a9fP77//nvatGnDvn376N69OzVq1OCqq646yVFaSWBz5mZcLhcOh4MidxGbMzcD+JLBzJkziYyM9CWCQz+bMQaDOezMr+TZ3qHTsguzeeOPNyhwFZDvzOfVua8iHo/fQVg8HgZ+O5CJqyaSXZhNgauAiOAI3B43WYVZFLoKCQ+yDqzZRdkUuYsIsYfg9rjJc+X5nSUWuApweVzYxGadBXuceIwHm8uDeDwUOsDhBrfdf/+4bbBk/RxqvWU1rLtiHaTGwCrvE4f7L4WVVWFJDcDAPfPhr0RYkADigSfnwK91YV5tsLvh5RkwqTHMrQPBLvjvVPimJcyqC2FOGPUd5B3heWz5Dnj6vm95vlcUCxOzaeKM4dd3MnnopirMqr6XDs5q/PHSbm67tzZfxO3iEmctZgzfze2PNeXTsJ10dtZn0jsbGTKsHSPNQq4Iasr/Rq3m3lc7M6Lwd64Ka8aIiUt55N1efJT9K3sjckuNY28EJEQlcEtuHf712x+EDL2PMTumMSS7GvfMnkPYv57ky20/MjQrmpvmzSTiuZeYmPYjd6cH0XvhTCq98S6TUn/kjv1OLln+K7EjPuHHDdO4dd8B2q7/lRp9xzB903T6791Jo+0zuTf0QKlx7IiCTpLErzd/xp9b/+SKzOUEFy1n9qAPmL99Pt1zlmHWr2P2oNdYunspXYqWU7h1M7/fMozV+1bT1iyiIH038259hE2Zm6gftICC3Cz+uv1Otmdvp0rkfApdBSwcOIDdObu5YtwVpcaxvaxPki6DM6730Xbt2plDu5hYvXo1TZs2LdPy45aPY/DkweQ583zjwoPCGdlr5Aklg8jISHJycgDrzHXZsmVcd911vPHGG0yZMoXc3FzuvfdeVqxYgdPpZNiwYfTu3Ru3281jjz3GtGnTsNls3HHHHdx7770sXLiQhx56iJycHOLj4xk1ahR2u53LL7+chQsXsnTpUlJSUkhLS6N27drUr1+f5cuX89prr/nOvN99910++ugjHA4HzZo146uvviI3N5fBdw1m6fKlOJ1O7n70bm7qexNvv/w2IsLzzz/v+0wzZszg6aef5o8//mDQoEH07NmTa6+91u/z5uTk0Lt3bzIyMnA6nbz44ov07t0bgOHDh/PFF19QpWoVEhMTadW6Ffc+cC+Xd7uc2o1qs+TvJVza+1Jq16vNZ+9+hrPISXRsNG+OeBNnoZPrLrsOm81GbOVYnnjpCf6c/SdhEWHcNOQmtm7eyvDHhpOZnonNbuOVEa+QmJR4+BdziH1p+7j8Z+tUUBDsboPLfvh8lQog+UAYq+uEk1WYRZ/UUDxuF7+3iCazIJO7FjsosHmYdF4smQWZPP+rIStU+LxLHAcKD/DJ14Vsjw3inZ7x5LvymfTeftYkhvDyDYm4PC5mPbOJ35tF8srNDVi0c1GpT/IVA5c1vJzIoEi+uGki07rX56ub2xAbGsv7V45g6jXJTBl4LlXD4nmh20v8NPACZg7oSEJIPEMveoTfhlzGogFdqWWP5cpOg1l8//Ws79edWp5I2nQdyKZHb2dv3yuoke+gRo8baHv1XrbEHB5HYhb8saQt5qGHcHTqTNCO3eQ+/RjBQx8gtP25yPYdZL71MhG33UVEi9a4t21h/9iPib5hEFENmlG4LY39074j9opriEysS8GubWT9PZfoCy4hNK4qzv37yNu8jvAmLQmKiCLuMSEj/PA4YvNg/6sGPB7rZbfDP6j3McYgIhS4CtiXt49qEdUIsgexN3cva/atoV3NdoQFhWF/VvCU0pzG7gHXc4bFOxczM3Umd7W/i1BHKH9t+4tZabN48NwHCbIHMXfLXGamzuTJjk9iExu/bv6VOWlzeLbzswBM2zCNP7b+wfMXW7+5SWsn8ff2v3nhkhcA+Hrl1yzdvZRXZg33FdeVFkdZichCY0ypZ6Zn3RXBA9MeYMmuJUec/ue2Pyl0+z/2NM+Zx20/3MbHCz8udZmU6im8fdnbZdq+y+Xixx9/5LLLLvMbP3z4cC655BI+++wzMjMz6dChA127dmX06NGkpqayZMkSHA4H+/fvx+l0cu+99/LDDz9QpUoVxo8fz1NPPcVnn31GQUEBBw4cYM6cObRr1445c+Zw4YUXUrVqVcLD/X89r7zyCps3byYkJITMzEwA/j3s3zRp34QHX3mQ7KxsBvUYRNsL2rJ42WLuuNX/uevt2rVj1apVviKIQlchBwoPUOQuwmDYnbOb/KJ83vj0DSpVqkR6ejrXXnottTvUZu3ytYwaO4rPf/wcl8vFgMsGUL1RddamryXflY/TWcToH61uqA5kHuDzyZ8jIvww7ns+fOdDHnv+Ma4ZcA0RERHceOeNRNjDmD9zHnax4zEenh36NIMHD+TS6/qwL2sfsS4HYblgqlQhuyib+Hwbkp+HJyHBGs50YisogPB47mp3F7e+9RsR67fQ7JY8SpMdAuN+jSFr5k/szt1N8+vvxe0souitX8guzCbh8uspCgtm2OBfcHqchPzal8KIWB4fOhGA3KU34kyowQMPWE9X3L/zburXqcPAoY8BkON+jR5169K3T1/qPCilHoBrZcHU/lOtgYaLuapqVa5K8N58v+4ResXF0SsuDoyBPQ/QPTKS7mFh1nDRfVxst3OxzXsEKbiV8yjxdJf0q2ldcmNpe+h0lTCmFf5JycDFm6HWryVOvhrXpMqEnw8ON4gj9v1xGGOsMvA69Ul65k08xsOunF1EVatKrcGP4HQ7WbV3FdWjq1Ot1w0UuAqYt3Ue9WLrUa3t+eQW5TJ9/Y8UhNoB92H7oyDUzvDZw+nbvC+NKjdiw/4NvDr3VR449wGaV23O4p2LefSXR3mz+5skV0tmdtpsbv3hViZeN5GU6ilMXjuZq8ZfxYLBC0ipnsKktZO4fuL1rLhrBc2rNuenjT8x4LsBrBu6joaVG5aaBADfQXlW2iwe+vkhBqUMItQRyszUmTw+43GGdhhKkD2I3zb/xjMzn+HxCx/HJjZ+2/wbw+cM9yWCWamz+GDBB75EMHfLXMYsG+NLBH9u+5NJ6yaVmgRKxnEynHWJ4FgOTQLHGl9W+fn5pKSkANCxY0duu+02/vjjD9/0n3/+mUmTJvHGG28AVpPXLVu2MH36dIYMGYLDYX0VcXFxrFixghUrVtCtWzcA3G43NWpY3TCdf/75/P7778yePZsnn3ySadOmYYyhY8eOh8WUnJxM//796dOnD3369MEYw08//0RhYSFjPhpjfe7CQnZu30meM4+d2TtZs28N+c58bGIjKysLt3GzZNcSMgoy2HZgG+vS1wHWWdXWA1txOV28+dybLP5rMTabjT279rB7926WzF/CJZdfQo3YGuQ587j0sm6EuIWEqASCbEF0vbKbL849O/fw5F1Psm/PPpxFThrVb0TdgjCqHvAQXrUKraq1wrk1lfgcDxE1qtA4qjH7du5hSPuLIbYeDeIa4Ny8EXtmFtKgNiKCa0sa4vFgj6pBDWrgKdoJtgIiCgqsis/00bB7N7V3/OuIB+Ha46ZAtZa0pCX8MAMcDoj1ls0sXAW2Er/E6fP8lg//8ge/4bj/+Fe2Rj74L9/7LlvsfB7tPuwA3GWLnU0ZmzDGUL+1ddj+e/vf2G122jRoA1hnlWGOMDolWc+WH710NJXDKtOjUQ8A3vjjDWpH1+a65tcB8OjPj9KsSjNuaX0LADd9exMX1LqAu9rfxc8pkUCO/44Q+C7lYAF1tTeq8eC5D/L4hY9T5C4i8qVInuv8HE90fII8Zx6RL0fyWtfXePSCR8ksyCThzQTeuewd7jvnPtLz02n+QXM+7PEhQ9oNYXfObs7/7Hw+u/Izbml9CztzdnLF/644YqP2ApuHf//2b5pXbU6jyo3IKshi6oap9GvZj+Y0B7BOMtxOAGJDYzk38VzCg6wTpIaVG/L4hY9TJdzqnaB9zfZ83OtjqkdWt76Hul34ZcAv1IyqCUBipUS2Hdh2WBy1o2sDMKTdEAalDKJSSCUAHjzvQYZ2GEqYw6rlfrLjkzx+4ePYxbrkfP7i530HeYCXu77My11f9g2/1u01Xuv2mm/4P93/w3+6/4ekt5NIyzq8v7g60XUOG/dPnXWJ4Fhn7kfbqTMHzfzH2y1ZR1AaYwzffPMNjRs3Pua6jDE0b96cefPmHTbtoosuYs6cOaSlpdG7d29effVVRIQePXpgjLEqDIty2Z2zm4+/+pg5s+fw4//9yDPPPcOXM77EGMOrI18lqUGS33rrNqzL4kWL6XhpRwyGIHsQa1esJTklmfCgcCJCIjAeQ43IGlYFpdNFsAvmT1uIJ8fDn7NnUpC+k/MvvZomMU1YznxsuekkhFYhNK4SkR4HVXMM8Y5KhDpCqRQS5tv260+/Tr/B/eh0aSeWzl3ImA++JCqmKrbISBxiJ8geRFCVmkhMDLbio6Xdga1JExDrqBFUOwnqiK+owFHb/0di8yZSVq+2/nornLv1/TefRhcddhC+dGswtGnDqr2r2Jyx2XdgnZM2h3Xp67itzW0AfLf6O1bvW82THZ8EYMSCEazet9r3f/j8rOdZl76OsVePBeCuKXeRmpXKj/1/BKD3V72ZllxauRD82iaG9d/fTJAtiF9v/hWAoT8OJS4szrf8EzOeoHZ0bV8iePX3V2lWpZkv3k8WfcK5ief6EsGstFkYDhYn7MrZRWZBJgB7KL1sPhen733fZn1pXsU66DpsDh45/xHOTTwXgBBHCK92fZWL6lwEQERQBCN6juD8WlYdT0xoDOOvHU/bGm0BqBpRlWn9p9GiqtVLfWKlRP687U+u/fraUg/AtaJrseHeDThs1mGrbc22bH/oYGcErWu05vdbf/cNt6zW0rffAZrEN+HFS170DdeNrcvtsbf7hmtE1aBG1MF+L1/p+kqpxcgvdXkJgFBHKKGOUN+0YHswwfaDSdNus2PnYLnjP22+PLzL8FLjGN5l+D9aX2nOiL6GTqbhXYb7zhCKneydWpru3bvz3//+l+I6mcWLrWeAd+vWjREjRuByWc3J9u/fT+PGjdm7d68vETidTlauXInHeOhwXgdGjxlNYlIiO3N2EhoVyg+Tf6BSg0os3LmQPbl72F+wn7TMNBavXUyzDs0Y+tRQcrJzcBe6ObfTuUz4fIIvjrUr1gLQd1Bffhj/A3s37qZNjTbEFEUyYvh7PP34YzSr0oxmdRuy7++1xBPGopmLcDqdJO+BgsxsalSvQawjnHW/LWDLFqsfwS6dL2HKrDmYIg/Z2dlMnfErxMcTFGz9cCJcB38UOQdyqFrdOtOeNuH/rJHR0UQlJJDtrXchIgLCw/FgCAoLIjExke9/+YVCVyE7M3eSk58PNhu5RblsP7Adt8cqWsgsyGR9+no8HqtVUHZhNnXerkOR22pxMTHZfnj5vMAvra2auM8Wf8Z1E6/zTfp61dc88svBlk/TN01nxMIRvuGNGRtZvGtxiVWJ3wGgSXwTWlc/WChzTdNrKMJV6v/MFtd+Xrj4BYZ1HuYb91GPj3ij2xu+4e+u/44Pe3zoG/7j1j/4os8XvuE1Q9cwqs8o3/D8O+bzxqUHl58+cDpPdHwCOHime6iS49+74j16Ne4FgE1svNTlJS6uezFgJYZ/XfAvzkm0epMPcYQwuO1g34E+1BHKdc2vo35cfQDCgsLo3qA7CZUSfNPPSTyHV7q+Uupv9KUuLxFkDzpl94P0b9mfkb1GUie6DoJQJ7rOCdclnq5xnHVXBMdSvPNOdbvxp59+mtvuuo2GzRri8XhIqJXA2Iljuf3221m3bh3JyckEBQVx86030/+2/rz3+Xs88MgDHMg6QJGziBvvuJE+sX0gHJxuJ43bNmZnzk6S2yezfft24ivHE2IP8TUFTKqUxOCrB1OQW4BDHDx4/4NEVYpiyH238epzb3Jj1xt9cbw1+i1qxMcz4dnneeSeR8jKzSU1NZVRzzzDZedcCMCQW2+nd58+dLigE5ddcQURERGQlMTAgTfT6+qradXxItq1bUuTJk0AaHPhhVw/YACtOnSgatWqtO/QAcLCcIvVPj035OA5yOCHB/P4nY9TKboSHS5oT97OXeQ78+nVqxdXXXMVX038ivffex+AfGc+K/as4JPPP+G+e+7jqX8/hcfm4duJ39K0UVOriCtnJ1UiqmDHbrX19jit5o7YcNgcXFL3EitR2OGAp/Q7jbe4rB7U7zvnPr//jRcufoFnOz3rG36/x/u8z/u+4ZKX9gBPd3rab/j+c+/3Gx7YaiDP/PZMqVeptaNr0zmps9+41jX8SvZJiknyG44OjS7185TFqTjzLIuK+o0eKZaK2O6pjiPgWg1VlLTMNPbmHd6Fdog9BI/x4PK4/C7ZwTqbDLZbN6c4bA4qhVTCYXNgExthjjD25e0j2BFMYiWrtcyy3cuIDI6kXmw9AHZn7SDCEUZkRCy43bBiBekOJ2kxVjvlYjYDdTKhclwCxMRAWBgfvP8+H374IbNnzSK2cmWOpbglhtvjJrMgk4jgCEIdoRS4CticsZmESglUCqlETlEOa/atOeq6KoVUolalWoQFhZHvzCc9P52qEVUJtgdT6CokpyiH6NBoHDYHLrfLqqx1hGATm+9K50hnjYf+rxytqDD1gdRjfu6Tobxasv3TWE6HA7A6+QKq1dDpqrQkAN47Ce0hhDpCiQuL85UxBtuDKXIX4fK4qBZZDYDVe1djExuN4616hoyCDGxy8My6aXgdHMWlfcZQbdNuiIuDiFirqV1sLLH708nJc7M3HKtIxEDlPIhxOaDGwfLRu++5h7vvsXoAcXvcGIzVNt7jYXfubiKDI4kKicLpdrJy70oSohKoElEFt8fN5szN1ImuQ6gjFJvYsNvsiLf8JcwRRoO4BmzJ2uIrnikp2B5Mo8qNfMNhQWEkBh1sFhriCCHEEeIbdtgdOOwH/42Pt9jgdDgL1jNgVdE0EZwGWlZrCcC2A9vYlbOL5lWtyrhNGZsocBX4EkFCVILfga4O0VDgBO+NJUHbdlgtWRo3tipNa9eGkIMHTWrXJiPUkO7ce7BcXGBfOIRUqkR176jUzFQigyOJD4/HGMPiXYupEVmDhErW9rdnbychKoGokCgcNgexobG+SrMgexDNqzT3S2glD+x2m52Y0BjcHjdpWWm+W/HBKnNOiCr12UTl5nQ5COsBWFUkTQSngeJilTBHGCbE+IaTYpL8zvgr5TohOxuSvEf+/fshNxeKH9ZTp47VxLFYKUU6202WX7EQgBHY4cn0JYJ8Z77vQC4i1I6u7au8ExHa1Gjji0tEqBNzsIWOiBAWFMaxFN89fLQuJk4VPQirQKeJ4BQoWezgx+DXYqVyeGUqu2N8w7b0/bBrFzRrZp3pFxVBXp51V6XNZp3x20vcFlvihrLiZAKwNWsrTo+TerH1Si2OAfzOzJtW8a9vqRpR1W+4ZHI6EZXDK1fIgV8p5S/gmo+eai6Pi437NxKXB0kZEOy9YTLYDUmZkJBrt/q6AesMf/Fi64AP1tl9WJhV0QtQvfrBpFA83XuwL76JBmD7ge2s2LPCN2y32X1tr0u2cy7pSOOVUmc/vSIoR8YYVu5ZidPjpGmOHYfLTXz+ITPluyEnB6KjrTP6GjUO9p8SE2O9innHF9/KH+YIQ0TYlbOLbQe20bp6a+w2O+FB4b6O12xi890pCVY9w+lQNq+UOn3oFcFJNHz4cJo3b05ycjIpKSn8OPNHnB4nYY4w7C7/vlPmLF5M8+uuI6VfP+YtW8bUqVMhNBQSEtidkUHPnj1p1aoVzZo14/LLLyerIIst27Zw7bXXsj9/P6v2riLfZWWVqOAoEisl+pqfxobFklgpsdQinMrhlakTXcevMrdOdB0tolEqgAXkFUF5tJWeN28eU6ZMYdGiRYSEhJC6I5U1u9YQExJD9cjquBzrCHIdPAsfN20aTwwaxE19+jBq0SIWLFjAFVdY3c0+/fTTnNfpPL5+4GvCgsL4a+FfrN+/nnqV6zFx4kScbid1Y+r6DuYRwRFEBEeUOVYtm1dKlRRwieDQm3fSstIYPHkwcGIPItm5cyfx8fGEhISQ58wjXdKpmVCTTYs20fdffXEVFpLcpAEPvvY4338/lS9nTOfHv/7k/5Ys4fcFC8jNy2XWnFn8+8l/s3PnThq0b0BmQSZhQWG0b9OenKIc9m7fy0VXXsSKFSsII4x+N/RjxYoVNG7cmB07dvD+++/Trl07IiMjuf/++5kyZQphYWH88MMPVKtW7aTsP6XU2eesLBrqPKozo5aMAqxK1M6jOjN2mdX51BPTnzisFU+eM48Hpj0AwL68fXQe1ZnJaycDVqdcZXHppZeydetWGjVqxK2Db2XBHwsQl3DLLbcw/vPPmfntOLJsbv43biJ9+vWh46UdufuZ+3hv7Mc899xzdLuyG1NnT+X6669n6NChvPToS/S7sh/Dhw9n185dVAqphN12sIXQBx98QGxsLKtWreKFF15g4cKFvmm5ubmce+65LF26lIsuuoiPPy69e22llIKzNBEcTWm9GoL1xKwTERkZycKFCxn+1nCiYqN4+u6nmTB6Aol1EmnUuDHbIz1c0bcHi/9a7Lfc9uztiAiVwypTK9p6GlX37t3ZtGkTd9xxB2vWrKF169bs3et/Z/LcuXO54YYbAGjRogXJycm+acHBwfTs2ROAtm3bkpqaekKfTSl1djsri4ZKdicdZA/yG64dXfuIHXwBxIfH+81f3Fd5WezK3UXd1nV56oKn6H5+d95//31C7CEQFkaRrfQ+nYrb9R/aNUJcXBz9+vWjX79+9OzZk9mzZ9O2bdsyxREUdLCHRrvd7uvZVCmlShNwVwTl1Q318pXLmb9sPjaxYRMbCxctpH5CAqkbN7Jh3TqC7cFM/WYqbc5t47dcsD2YqKgosrOzfeN+/fVX8vKs4qvs7Gw2btxI7dr+XQRfcMEFTJgwAYBVq1axfPnyE4pfKRW4zsorgqMpj75lPMbD2p1reeHxFyjIKcBj89CkYRM+f/5FbuzWjb7XX09hUSENWzbkmgHX+JYTsZ7YlXhxIq+88gopKSk88cQTbNmyhaFDh+JwWJ283X777bRv396viOfuu+/m5ptvplmzZjRp0oTmzZsTHf3PuyBWSgUu7Yb6BBljWJe+juyibOrH1ic2LNbXdw4AHg+ZRQeIDolmf/7+k9a3jtvtxul0EhoaysaNG+natStr164lOFjvED6aM6HLcqXKg3ZDXY525uwkuyibyOBI37NJg/ekQ2wshIaS48pjw/4N1I6uTdWIqiet/X5eXh4XX3wxTqcTYwwffPCBJgGl1D+iieAE5Dvz2ZWzizBHGGGOMDZkbCA5tgmOXbvAGKhZk8jgSBrENfA94PpkiYqK4tArI6WU+ic0EfxDha5CNuzfgF3sNKzcELvYiQuLwxESDs2bYxwOXG4nQfYgYkJjKjpcpZQ6ooBrNXQyGGNYm76WQnchNaNq4rA5sCNE5Rd3LRrMnry9rNizgkJXYcUGq5RSx6BXBP/A3ry9FLmLiAuNY1fOLg4UHqC+MxK2brW6iQ4PJzo0GpfHpd07K6VOe5oIjlNmfiZbs7YSHRJN3di6ZBRkWAf7oAgIDcWEhSFAqCOUhEratbNS6vSnRUPHId+Zz4aMDdjERp2YOogIcfZIIu1hIML3v/2GzWbj179/5ZxzziElJYXatWtTpUoVUlJSSElJ0e4elFKnncBMBOPGQVKS9aSvpCRr+BiMMWw9sBWAmlE1Wb13NQcKDsCmTbBuHRjDl19+Sfvz2jNp4iT++usvlixZwvPPP8/111/PkiVLWLJkCUlJSeX60ZRS6ngFXiIYNw4GD4a0NKuJZ1qaNXyMZLAjewcHCg9QJ7oOMaExRARHEBoUCjVrQvXq5OTmMnfuXMaOGsuP3/9Y6jomT57MOeecQ+vWrenatSu7d+8GYNiwYdx666107tyZevXq8e677570j62UUkdydiaCzp1h1CjrvdNpDY+1uqHmiSesB8CXlJcHDzxgvd+3z5p/stUNNbusx0DuzNlJTGgM8eHxhDhCaBBTz6obqFQJExPDZ19+RtdLu9KoUSMqV67s1y10sQsvvJA///yTxYsXc8MNN/Daa6/5pq1Zs4affvqJ+fPn89xzz+F0Og9bXimlysPZmQiOZlvp3VCTXno31EWuIvbm7sUudmJCY6zn/RYWwooV1sPmsXoQnThhIj2u6gHADTfcwJdfflnKprfRvXt3WrZsyeuvv87KlSt903r06EFISAjx8fFUrVrVd7WglFLlrVwTgYhcJiJrRWSDiDxeyvTaIvKbiCwWkWUicsVJ2fDMmTBokPU+KMgavukma/iQXjx9isfHx1vz9+qFx3jYGJKLwdC0SlOcbif5znywCUREQFgYALkHclnw+wIevfdRkpKSeP3115kwYQKH9uN07733MnToUJYvX86IESMoKCjwTQsJCfG9166jlVKnUrklAhGxA+8DlwPNgBtFpNkhs/0bmGCMaQ3cAHxQXvH4DB8O4f7dUBMebo0vwRjDqr2ryHXmkhSTRKgjlBpRNWgc3xhbUDDUr48nNISM/Ay+/vprBgwYQFpaGqmpqWzdupW6desyZ84cv3VmZWWRkGA1Kf3iiy/K9WMqpVRZlecVQQdggzFmkzGmCPgK6H3IPAYo7oQnGthRjvFY+veHkSOhTh0Qsf6OHGmNL2F//n4KXAVEBkfi8risx1tmZ2PbuAm8Z+v78vaxMWMj474cx1VXXeW3/DXXXHNY8dCwYcPo27cvbdu2JT4+vnw/p1JKlVG5dUMtItcClxljbvcODwDOMcYMLTFPDeBnIBaIALoaYw6vZS3hVHRDne/MZ/W+1YQ5wmgY15CVe1cSExpDHVcE7N4NTZqA3Y4xhgOFB4gO1ecAnCm0G2oVqE7nbqhvBEYZY/4jIucBY0SkhTHGU3ImERkMDAYOe1LXyVboKmTNvjXYxEb9uPo47A6aVWmGTWxgs0NcHC484HHhsDk0CSilznjlWTS0HahVYjjRO66k24AJAMaYeUAocFiZiTFmpDGmnTGmXZUqVcopXKteIDUzFbdxUzOqJrlFuRhjCNqfiT3X2+TUZmNL1hbW7FuDxz9fKaXUGak8E8HfQEMRqSsiwViVwZMOmWcL0AVARJpiJYK95RjTUe3N20t2UTY1ImvgsDnYmLGRAwVZsGeP9fKqGlGVahHVrKsEpZQ6w5Vb0ZAxxiUiQ4GfADvwmTFmpYg8DywwxkwCHgY+FpEHsSqOB5kKenbm7pzdbDuwjeiQaGpG1QSgQWwDKoVGQ5MoMAZjDCJCZHAkkcGRFRGmUkqddOVaR2CMmQpMPWTcMyXerwIuKM8YysLldrHtgHWjWe3o2rg9bhw2OzH5HusaxVsxvC59HTGhMVSLrFaxASul1EkU8GUbxhg2Z24GoH5cfXZk72DVvlV4sr0dynnvOPYYDw6bA4etouvXlVLq5Ar4RLApYxNZhVnUiq5FTGgMVSOqUiOyBrZK0dCwIVS2HjZvt9mpF1vviA+fFxEefvhh3/Abb7zBsGHDTsVHKLPhw4fTvHlzkpOTSUlJ4a+//gLg9ttvZ9WqVf9onampqbRo0eKkxdinTx/OPfdcv3GDBg1i4sSJJ20bSil/AZkIxi0fR9LbSdies3Hh5xfy6+ZfiQ+3GitF2EOpEuRtEhodjdt4SM1MpchdhIgccZ0hISF8++237Nu371R8hCNyu92ljp83bx5Tpkxh0aJFLFu2jOnTp1OrltWo65NPPqFZs0Nv+j71MjMzWbhwIVlZWWzatKmiw1EqYARcIhi3fByDJw8mLSsNg2FXzi6em/Ucb/zxBrtzdlud0q1a5bt7ONeZy/78/cd89rDD4WDw4MG89dZbh01LTU3lkksuITk5mS5durBlyxbAOtO97777OP/886lXr57vrPeZZ57xPcgmISGBW265BYCxY8fSoUMHUlJSuPPOO30H/cjISB5++GFatWrFvHnzePPNN2nRogUtWrTg7bffBmDnzp3Ex8f7+jSKj4+nZk2rUrxz584U36T36aef0qhRIzp06MAdd9zB0KFDjxrrkcyYMYPWrVvTsmVLbr31VgoLrf03depUmjRpQtu2bbnvvvvo2bOnb5lvv/2WXr16ccMNN/DVV1/5rW/69Om0a9eORo0aMWXKFABWrlzp2x/JycmsX7/+qDEppY7AeFvDnCmvtm3bmkOtWrXKb7jT553M54s/N8YYU+QqMp0+72TGLB1jjDGm1pu1DMM47BX3SpzJzM80e9O3mk4jzzeT1kwyxhizM3uncbqdh23zUBERESYrK8vUqVPHZGZmmtdff908++yzxhhjevbsaUaNGmWMMebTTz81vXv3NsYYc/PNN5trr73WuN1us3LlSlO/fn2/dWZkZJgWLVqYBQsWmFWrVpmePXuaoqIiY4wxd911l/niiy+MMcYAZvz48cYYYxYsWGBatGhhcnJyTHZ2tmnWrJlZtGiRyc7ONq1atTINGzY0d911l5k5c+bB/dWpk/n777/N9u3bTZ06dUx6eropKioyF154obnnnnuOGuvmzZtN8+bN/eLOz883iYmJZu3atcYYYwYMGGDeeust3/hNmzYZY4y54YYbTI8ePXzLde3a1cyePdusXbvWtGjRwjf+5ptvNt27dzdut9usW7fOJCQkmPz8fDN06FAzduxYY4wxhYWFJi8v75jf06H/K0oFCqzWmqUeVwPuiqC4ddChMgoyrLuEQ0MhKAinx2k9gQzKXEFcqVIlBg4ceNiDZebNm0e/fv0AGDBgAHPnzvVN69OnDzabjWbNmvl1PW2M4aabbuKhhx6ibdu2zJgxg4ULF9K+fXtSUlKYMWOGr/jEbrdzzTXXADB37lyuuuoqIiIiiIyM5Oqrr2bOnDlERkaycOFCRo4cSZUqVbj++usZVfzMBq/58+fTqVMn4uLiCAoKom/fvn7TjxTrodauXUvdunVp1KgRADfffDOzZ89mzZo11KtXj7p16wJw4403+pbZvXs369ev58ILL6RRo0YEBQWxYsUK3/TrrrsOm81Gw4YNqVevHmvWrOG8887jpZde4tVXXyUtLY0wb2+wSqnjc1YmgpmDZjIoZRAAQfYgvrnuG5KrJbNgxwKqR1YvdZna4dVh+3biw+OZOWgmbWu0ZUPGBuLDjq9zuAceeIBPP/2U3NzcMs1fsvtpU+IWimHDhpGYmOgrFjLGcPPNN/seebl27VpfZXRoaCh2u/2Y27Lb7XTu3JnnnnuO9957j2+++eY4PtmRYz0ZJkyYQEZGBnXr1iUpKYnU1FS/TvsOrZ8REfr168ekSZMICwvjiiuu4Ndffz2pMSkVKM7KRFBSel66r7IX4K72dxHqCPWbJ9wRxvD2j1vPGPCqVakWjeIa4bAfX3PRuLg4rrvuOj799FPfuPPPP99X5j1u3Dg6dux41HVMnjyZ6dOn+11ZdOnShYkTJ7LHe4fz/v37SUtLO2zZjh078v3335OXl0dubi7fffcdHTt2ZO3atX5l6EuWLKFOnTp+y7Zv355Zs2aRkZGBy+U67kRRrHHjxqSmprJhwwYAxowZQ6dOnWjcuDGbNm0iNTUVgPHjx/uW+fLLL5k2bRqpqamkpqaycOFCv3qCr7/+Go/Hw8aNG9m0aZNvXfXq1eO+++6jd+/eLFu27B/Fq1SgO+sbxW89sBXDwbPXyxtcDsCHf3/Irpxd1IquxUtdXqJ/S6sb6iJXEQ67A5vNRmTIP7t7+OGHH+a9997zDf/3v//llltu4fXXX6dKlSp8/vnnR13+zTffZPv27XTo0AGAK6+8kueff54XX3yRSy+9FI/HQ1BQEO+///5hB/M2bdowaNAg37K33347rVu3ZuHChdx7771kZmbicDho0KABI0eO9Fs2ISGBJ598kg4dOhAXF0eTJk2Ijj52p3pr164lMTHRN/zWW2/x+eef07dvX1wuF+3bt2fIkCGEhITwwQcfcNlllxEREUH79u0BqzI9LS3Nr9lo3bp1iY6O9jVxrV27Nh06dODAgQN89NFHhIaGMmHCBMaMGUNQUBDVq1fnySefPGasSqnDlVs31OXleLuhXrBjQanjAdpVbgmbN0NSEoSG4jEeVu1dRagjlAZxDU5m2GeMnJwcIiMjcblcXHXVVdx6662HPWvhZKzfGMM999xDw4YNefDBB0/a+o9Fu6FWgepo3VCf9UVDR2OKiqyH23vLn21iIyEqgaoRVSs4soozbNgwUlJSaNGiBXXr1qVPnz4ndf0ff/wxKSkpNG/enKysLO68886Tun6l1PE7668Iluxagstz+PN/7WKndY3WYAyI+DqUU2c3vSJQgSqgrwhiQ2MPGxfmhNrOcF8ScLqdrNizgsyCzFMfoFJKVbCzPhFkFWYdNq56DoRn5FiJADAYQhwhhNhDDptXKaXOdmd9q6EidxFxeZCQDcFuKLLD9ijYVsnQymblwWB7MI0qN6rgSJVSqmKc9VcEVQsc1MmCEDcI1t86WRDrdJDvzCctMw23p/SO2pRSKhCc9YkgIRvsh9SH2401Pqcoh4yCDNzmxBOB3W73dRSXkpLCK6+8Uup8a9asISUlhdatW7Nx48YT3q5SSp2os75oyO48vMUQwJ7sXdzw9f387+r/EWwPPuHthIWFsWTJkqPO43a7+f7777n22mv597//fcLbVEqpk+GsvyIg+PCDfE4wPLP5M+ZumcvwOcPLdfNJSUk89thjtGnThvHjx/P222/z4YcfcvHFF5frdpVSqqzOuiuCB6Y9wJJdSw6OcDqhsNDXQmjO/sV4SnQ58eGCD/lwwYfYxEbH2qX3AZRSPYW3L3v7qNvNz88nJSXFN/zEE09w/fXXA1C5cmUWLVoEwLp164iMjOSRRx45/g+nlFLl4KxLBIcJCsKJmyKPE49Aiyot2JGzg/0FGXiMB5vYiA+Pp35s/RPazNGKhooTglJKnY7OukRw6Jl7el46aVlpeIzHN+6Vua/w3ervCHWEUuQu4pqm1/BBjw/KLaaIEr2aKqXU6easryPYnr3dLwkApOenc23za/nztj8Z0nYIu3J2VVB0SilV8c66K4JDFT+HoKTXu70OQKvqrXi/x/snZTuH1hFcdtllR2xCqpRSp5OzPhEE24NLTQYno8loScUPkj9U8UNYihU/VUwppU4XZ33RUEJUAjbx/5jF3U0rpZQKgCuCyuGVAauuoMhdRLA9mISoBN94pZQKdGd9IgArGeiBXymlSnfWFw0ppZQ6Ok0ESikV4DQRKKVUgNNEcJIUd0PdokUL+vbtS15eHgsWLOC+++47pXF89NFHjB49+riXmzlzJj179jzh7Xfu3JlDnyl9JKNGjaJKlSqkpKTQpEkT3nrrrWMuk5SUxL59+/zGRUZGHrbeoUOHlj1opQJcQCaCccvHkfR2ErbnbCS9ncS45eNOeJ3FfQ2tWLGC4OBgPvroI9q1a8e77757EiIuuyFDhjBw4MBTus0Tcf3117NkyRJ+//13hg8fztatWys6JKUCTsAlgnHLxzF48mDSstIwGNKy0hg8efBJSQbFOnbsyIYNG/zOsnNzc7n11lvp0KEDrVu35ocffgCsG9EeeeQRWrRoQXJyMv/9738BWLhwIZ06daJt27Z0796dnTt3smfPHtq2bQvA0qVLERG2bNkCQP369cnLy2PYsGG88cYbALz77rs0a9aM5ORkbrjhhqPGcSQ///wz5513Hm3atKFv377k5OQA8Pzzz9O+fXtatGjB4MGDMcb/6T8ej4dBgwbx73//m4suusivQ74LL7yQpUuX+s1fuXJlGjRowM6dOwEYO3YsHTp0ICUlhTvvvPOIN+wppU7cWZkIOo/qzKglowBwup10HtWZscvGAvDE9CfIc+b5zZ/nzOOBaQ8AsC9vH51HdWby2skAx90Pkcvl4scff6Rly5Z+44cPH84ll1zC/Pnz+e2333j00UfJzc1l5MiRpKamsmTJEpYtW0b//v1xOp3ce++9TJw4kYULF3Lrrbfy1FNPUbVqVQoKCjhw4ABz5syhXbt2zJkzh7S0NKpWrUp4eLjfNl955RUWL17MsmXL+Oijj44aR2n27dvHiy++yPTp01m0aBHt2rXjzTffBGDo0KH8/fffrFixgvz8fKZMmeK3D/r370/Dhg158cUXue222xg1yvo+1q1bR0FBAa1atfLb1pYtWygoKCA5OZnVq1czfvx4fv/9d5YsWYLdbmfcuJOXqJVS/sp0H4GIfAt8CvxozCE9uJ1hth3YVur49Lz0E1pvyb6GOnbsyG233cYff/zhm/7zzz8zadIk39l6QUEBW7ZsYfr06QwZMgSHw/oq4uLiWLFiBStWrKBbt26AddVQo0YNAM4//3x+//13Zs+ezZNPPsm0adMwxtCx4+HPUkhOTqZ///706dOHPn36HDWO0vz555+sWrWKCy64AICioiLOO+88AH777Tdee+018vLy2L9/P82bN6dXr14A3HnnnVx33XU89dRTAPTt25cXXniB119/nc8++4xBgwb5tjF+/Hhmz57NmjVreO+99wgNDWXGjBksXLiQ9u3b+/Zt1apVj+PbABE5rvmVCmRlvaHsA+AW4F0R+Rr43BiztvzCOjEzB830vQ+yB/kN146uTVpW2mHL1I6uDUB8eLzf/NUjq5dpm8d6VKUxhm+++YbGjRsfc13GGJo3b868efMOm3bRRRf5rgJ69+7Nq6++iojQo0ePw+b9v//7P2bPns3kyZMZPnw4y5cvP2Icu3fvLjWObt268eWXX/qNLygo4O6772bBggXUqlWLYcOGUVBQ4Jt+/vnn89tvv/Hwww8TGhpKeHg43bp144cffmDChAksXLjQN+/111/Pe++9x4IFC7j00ku58sorMcZw88038/LLLx9zX4G174uKigj2Po1u//79xMfHl2lZpVQZi4aMMdONMf2BNkAqMF1E/hCRW0Qk6EjLichlIrJWRDaIyONHmOc6EVklIitF5H//5EMcj+FdhhMe5F+EEh4UzvAu5fvIyu7du/Pf//7XV5a+ePFiALp168aIESNwuaxnK+/fv5/GjRuzd+9eXyJwOp2sXLkSsK42xo4dS8OGDbHZbMTFxTF16lQuvPBCv+15PB62bt3KxRdfzKuvvkpWVhY5OTlHjKM05557Lr///jsbNmwArPqF4qIdgPj4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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# reset y\n",
    "y = {}\n",
    "\n",
    "ifnode_spiking_neural_network_PiecewiseQuadratic = mnist(surrogate_fn=\"PiecewiseQuadratic\").spike()\n",
    "print(\"===> IFNode PiecewiseQuadratic\")\n",
    "train(ifnode_spiking_neural_network_PiecewiseQuadratic, \"PiecewiseQuadratic\")\n",
    "\n",
    "ifnode_spiking_neural_network_SoftSign = mnist(surrogate_fn=\"SoftSign\").spike()\n",
    "print(\"===> IFNode SoftSign\")\n",
    "train(ifnode_spiking_neural_network_SoftSign, \"SoftSign\")\n",
    "\n",
    "ifnode_spiking_neural_network_ATan = mnist(surrogate_fn=\"ATan\").spike()\n",
    "print(\"===> IFNode ATan\")\n",
    "train(ifnode_spiking_neural_network_ATan, \"ATan\")\n",
    "\n",
    "ifnode_spiking_neural_network_NonzeroSignLogAbs = mnist(surrogate_fn=\"NonzeroSignLogAbs\").spike()\n",
    "print(\"===> IFNode NonzeroSignLogAbs\")\n",
    "train(ifnode_spiking_neural_network_NonzeroSignLogAbs, \"NonzeroSignLogAbs\")\n",
    "\n",
    "ifnode_spiking_neural_network_Erf = mnist(surrogate_fn=\"Erf\").spike()\n",
    "print(\"===> IFNode Erf\")\n",
    "train(ifnode_spiking_neural_network_Erf, \"Erf\")\n",
    "\n",
    "ifnode_spiking_neural_network_PiecewiseLeakyReLU = mnist(surrogate_fn=\"PiecewiseLeakyReLU\").spike()\n",
    "print(\"===> IFNode PiecewiseLeakyReLU\")\n",
    "train(ifnode_spiking_neural_network_PiecewiseLeakyReLU, \"PiecewiseLeakyReLU\")\n",
    "\n",
    "plot()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Hybrid"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "===> Hybrid Spiking Neural Network\n",
      "Test Accuracy: 96.68%, Elapsed time: 0:04:11.330691\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# reset y\n",
    "y = {}\n",
    "\n",
    "spiking_neural_network = mnist(\n",
    "                 timesteps = 10,\n",
    "                 node =\"IFNode\",\n",
    "                 voltage_threshold = 1.0,\n",
    "                 voltage_reset = 0.0,\n",
    "                 learnable_threshold = False,\n",
    "                 learnable_reset = True,\n",
    "                 time_dependent = True,\n",
    "                 neuron_wise = True,\n",
    "                 surrogate_fn = \"SoftSign\",\n",
    "                 binary = True,).spike()\n",
    "print(\"===> Hybrid Spiking Neural Network\")\n",
    "train(spiking_neural_network)\n",
    "\n",
    "plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
